from rest_framework import serializers
from django_redis import get_redis_connection
from redis import RedisError
import logging

#  日志记录器
logger = logging.getLogger('django')

class ImageCodeCheckSerializer(serializers.Serializer):
    """校验图片验证码序列化器"""
    # 初步验证
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(min_length=4,max_length=4)

    # 进一步校验
    def validate(self, attrs):
        """对比图片验证码"""
        # 获取经过字段校验的image_code_id和text
        image_code_id = attrs['image_code_id']
        text = attrs['text']

        # 使用image_code_id查询除redis中的图片验证码
        redis_conn = get_redis_connection('verify_codes')
        image_code_server = redis_conn.get('image_%s' % image_code_id)

        # 判断服务器存储的图片验证码是否有效，有可能过期了
        if image_code_server is None:
            raise serializers.ValidationError('无效的图片验证码')

        # 删除图片验证码内容，在获取图片验证码内容之后，在对比之前
        try:
            redis_conn.delete('image_%s' % image_code_id)
        except RedisError as e:
            logger.error(e)

        # 使用text和服务器中的image_code_server进行对比
        # py3中redis数据库读取的数据类型是bytes
        image_code_server = image_code_server.decode()

        # 大小写同步
        if text.lower() != image_code_server.lower():
            raise serializers.ValidationError('输入图片验证码有误')

        # 校验60秒内是否重复发送短信
        # 学习从序列化器中获取请求传入到视图中的额外的数据
        mobile = self.context['view'].kwargs['mobile']
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag == 1:
            # print('#' * 50)
            raise serializers.ValidationError('发送短信过于频繁')

        return attrs